/**
 * 给定一个树，问能否将之恰好切成若干个三点两边的结构，若能输出方案
 * 令Di表示i节点可以提供节点数量, 则D[叶子] = 1
 *       1, 如果其儿子的D全是0
 * Di =  2， 如果恰好有一个D为1的儿子
 *       0， 如果恰好有一个D为2的儿子或者恰好有二个D为1的儿子
 *       -2, 其他表示不能
 * 
 * 对于i节点，如果D[son] = 0, 则i-son之间的边应该切除
 * 最后D[1]应该为0，才能
 */
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;
using vi = vector<int>;

int N;
vector<vi> G;
vector<pii> Edges;
vi D;
vi Ans;

int dp(int u, int p){
    if(G[u].size() == 1 and u != 1){
        return D[u] = 1;
    }

    int c[3] = {0};
    for(auto i : G[u]){        
        auto v = Edges[i].first + Edges[i].second - u;
        if(v == p) continue;
        auto t = dp(v, u);
        if(-2 == t) return -2;
        if(0 == t) Ans.push_back(i);
        ++c[t];
    }
    
    if(c[1] and c[2]) return D[u] = -2;
    if(c[2] > 1) return D[u] = -2;
    if(c[1] > 2) return D[u] = -2;

    if(1 == c[1]) return D[u] = 2;
    if(2 == c[1]) return D[u] = 0;
    if(1 == c[2]) return D[u] = 0;
    return D[u] = 1;
}

void proc(){
    if(2 == N) return (void)(cout << -1 << endl);
    if(3 == N) return (void)(cout << 0 << endl << endl);

    Ans.clear();
    Ans.reserve(N);
    D.assign(N + 1, -1);
    if(dp(1, 0)) {
        return (void)(cout << -1 << endl);
    }

    cout << Ans.size() << endl;
    for(auto i : Ans) cout << i << " ";
    cout << endl;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase; cin >> nofkase;
    for(int kase=1;kase<=nofkase;++kase){
        cin >> N;
        G.assign(N + 1, {});
        Edges.clear();
        Edges.reserve(N + 1);
        Edges.push_back({});
        for(int a,b,i=1;i<N;++i){
            cin >> a >> b;
            if(a > b) swap(a, b);
            G[a].push_back(i);
            G[b].push_back(i);
            Edges.push_back({a, b});
        }
        proc();
    }
    return 0;
}